//
//  UserAccountViewModel.swift
//  01-界面搭建
//
//  Created by Apple on 15/11/6.
//  Copyright © 2015年 Apple. All rights reserved.
//
//视图模型没有父类
import Foundation

class UserAccountViewModel {
    ///设置单例
    static let shardViewModel = UserAccountViewModel()
    //定义用户头像 URL
    var avatarUrl:NSURL {
    
        return NSURL(string: account?.avatar_large ?? "")!
    }
    //定义模型属性
    var account:UserAccount?
    ///定义用户登录标记
    var userLogin:Bool{
        // 1. 如果 token 有值，说明登录成功
        // 2. 如果没有过期，说明登录有效      //感觉后面 isE加上多余，先执行的构造函数，在里面已经判断日期是否过期了
        return account?.access_token != nil && !isExpired
        //简化版：account != nil
    }
    /// 返回有效的 token
    var token:String? {
        if !isExpired {
        // 如果 token 没有过期，返回 account.中的 token 属性
        return account?.access_token
        }
    return nil
    }
    //计算型属性 归解档路径
    private var accountPath:String {
        
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    ///判断日期是否过期
    private var isExpired:Bool {
        // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
        //      account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        //        print(account?.expiresDate)
        
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            
            return false
        }
        //过期返回true
        return true
    }
    //构造方法 恢复数据---私有化
    private init () {
        account =  NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        if isExpired {
            print("已经过期")
            //如果过期，恢复的数据设置nil
            account = nil
            
            
        }
       // print(account)
    }
}
//MARK: - 抽取用户网络方法
extension UserAccountViewModel {
    func loadAccessToken(code:String,finished:(isSuccessed:Bool)->()){
        // 4. 加载 accessToken
        NetworkToos.shardTools.loadAccessToken(code) { (result, error) -> () in
            // 1> 判断错误
            if error != nil || result == nil {
                print("出错了")
                finished(isSuccessed: false)
                return
            }
            //字典转模型
            self.account = UserAccount(dict:result as! [String:AnyObject])
            // 2> 输出结果
            self.loadUserInfo(self.account!,finished: finished)
            
        }
    }
    private func loadUserInfo(account:UserAccount,finished:(isSuccessed:Bool)->()) {
        
        NetworkToos.shardTools.loadUserInfo(account.uid!) { (result, error) -> () in
            if error != nil {
                print("加载用户出错了")
                 finished(isSuccessed: false)
                return
            }
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String:AnyObject] else{
                print("格式错误")
                 finished(isSuccessed: false)
                return
            }
            //dict字典一定有值
            //保存用户头像和昵称到模型中
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            //保存数据
           NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            print(self.accountPath)
            finished(isSuccessed: true)
            
        }
        
    }
    
}